/**
  ******************************************************************************
  * @file    main.c
  * @author  MCU Application Team
  * @Version V1.0.0
  * @Date    2022-8-19
  * @brief   main function
  ******************************************************************************
  */
/* Includes ------------------------------------------------------------------*/
#include "main.h"


/* Private define ------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
static uint8_t beep_event,beep_time,beep_cnt;
/*******************************************************************************
**功能描述 ：蜂鸣器执行函数
**输入参数 ：
**输出参数 ：
*******************************************************************************/
void Beep_time_event(void)
{
    if ( beep_event ) beep_event--;
}
/*******************************************************************************
**功能描述 ：蜂鸣器设置参数函数
**输入参数 ：time 每次周期(100ms)  cnt 次数
**输出参数 ：
*******************************************************************************/
void Beep_time_set(uint8_t time,uint8_t cnt)
{
    beep_time = time;      //一次鸣叫时间 单位100ms
    beep_cnt = cnt;        //鸣叫多少次
    beep_event =  2*time;
    BSP_LED_Off(BEEP) ;    //打开蜂鸣器
}
uint8_t Beep_time_get(void)
{
     return beep_time;
}
/*******************************************************************************
**功能描述 ：蜂鸣器执行函数
**输入参数 ：
**输出参数 ：
*******************************************************************************/
void Beep_task(void)
{
    static uint8_t beep_flag = 0; //鸣叫标志
    //执行次数
    if( beep_cnt )
    {
        if( beep_event/beep_time == 0 ){
          //执行周期
            BSP_LED_On(BEEP) ;     //关闭蜂鸣器
            if(beep_flag && beep_event == 0 )
            {
               beep_cnt --;        //执行完成一次鸣叫
               beep_flag = 0;
               beep_event = 2*beep_time; //循环周期
            }
        }else{
            BSP_LED_Off(BEEP) ;    //打开蜂鸣器
            beep_flag = 1;
        } 
    }else{
        BSP_LED_On(BEEP) ;     //关闭蜂鸣器
        beep_flag = 0;         //清除状态标志
        beep_event = 0;        //停止计数
    }

}

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/*******************************************************************************
**功能描述 ：执行函数
**输入参数 ：
**输出参数 ：
*******************************************************************************/
int main(void)
{
    /*使能TIM1时钟*/
  LL_APB1_GRP2_EnableClock(RCC_APBENR2_TIM1EN);  
  /* 配置系统时钟 */
  SystemClock_Config();
  /*******输出控制gpio初始化****/
  BSP_LED_Init(RUN_LED);
  BSP_LED_Init(BEEP);
  BSP_LED_Init(RS_485EN);
    
  /******拨码开关gpio初始化*****/
  BSP_PB_Init(DIP_D1,BUTTON_MODE_GPIO); 
  BSP_PB_Init(DIP_D2,BUTTON_MODE_GPIO); 
  BSP_PB_Init(DIP_D3,BUTTON_MODE_GPIO); 
  BSP_PB_Init(DIP_D4,BUTTON_MODE_GPIO); 
  /******485串口初始化*******/
  usart_init();
  BSP_LED_On(RS_485EN);            /* 接收模式 */  
  /*配置并开启TIM1计数模式*/
  APP_ConfigTIM1Count();
  /*******TM1650初始化******/    
  TM1650_init ();
  /*******IWDG配置**********/
#if  IWDG_EN
    IWDG_Config();
#endif

  while (1)
  {
      Beep_task();           //蜂鸣器执行动作
      TM1650_task();         //处理键盘数据
      /*喂狗*/
#if  IWDG_EN
      LL_IWDG_ReloadCounter(IWDG);
#endif     
  }
}

/*******************************************************************************
**功能描述 ：系统时钟配置函数
**输入参数 ：
**输出参数 ：
*******************************************************************************/
void SystemClock_Config(void)
{
  /* 使能HSI */
  LL_RCC_HSI_Enable();
  while(LL_RCC_HSI_IsReady() != 1)
  {
      
  }

  /* 设置 AHB 分频*/
  LL_RCC_SetAHBPrescaler(LL_RCC_SYSCLK_DIV_1);

  /* 配置HSISYS作为系统时钟源 */
  LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_HSISYS);
  while(LL_RCC_GetSysClkSource() != LL_RCC_SYS_CLKSOURCE_STATUS_HSISYS)
  {
      
  }

  /* 设置 APB1 分频*/
  LL_RCC_SetAPB1Prescaler(LL_RCC_APB1_DIV_1);
  LL_Init1msTick(8000000);

  /* 更新系统时钟全局变量SystemCoreClock(也可以通过调用SystemCoreClockUpdate函数更新) */
  LL_SetSystemCoreClock(8000000);
}

/*******************************************************************************
**功能描述 ：错误执行函数
**输入参数 ：
**输出参数 ：
*******************************************************************************/
void Error_Handler(void)
{
  while(1)
  {
  }
}



#ifdef  USE_FULL_ASSERT
/*******************************************************************************
**功能描述 ：输出产生断言错误的源文件名及行号
**输入参数 ：file：源文件名指针
**输入参数 ：line：发生断言错误的行号
**输出参数 ：
*******************************************************************************/
void assert_failed(uint8_t *file, uint32_t line)
{
}
#endif /* USE_FULL_ASSERT */

/************************ (C) COPYRIGHT Xinling *****END OF FILE****/
